import { bus } from '@/main.js';
import axios from 'axios';
import moment from 'moment';
import Cookies from 'js-cookie';
import _ from 'lodash';
import qs from 'qs';
// import Mock from 'mockjs';
import storage from '@/assets/storage.js';

// if (process.env.MOCK) {// 环境配置，一般用于开发初期，反正线上版本肯定不用
//   require('./mock.js')
// }// 本地开发，引入MOCK的拦截规则，用于开发早期自编

const { config } = require('@/../config/axios_config.js');
console.log(config.host);
// import config from './config.js';
// require/import 目前看来两者皆可

let axiosLogin = axios.create({
  timeout: 1000 * 20,
  baseURL: `${config.host}`,
});
axiosLogin.defaults.headers.post['Content-Type'] =
  'Content-Type:application/x-www-form-urlencoded; charset=UTF-8'; //预防跨域

// 添加请求拦截器
axiosLogin.interceptors.request.use(
  (config) => {
    let token = Cookies.get('token');
    _.set(config, 'headers.token', token);
    // 如果使用全局loading，可以在这里open，不过……
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
axiosLogin.interceptors.response.use(
  function(response) {
    // 如果使用全局loading，可以在这里close，不过……
    // 对响应数据做点什么
    if (response.config.responseType == 'blob') {
      return response; //对Blob不做脱壳处理
    }
    if (response.status === 200) {
      if (response.data.code === 401) {
        let tempConfig = response.config; //缓存原始请求的配置备用
        let url = `${config.host}/api/User/UpdateToken`;
        return axios
          .get(url, {
            headers: { token: tempConfig.headers.token },
          })
          .then((res) => {
            if (res.code == 200 && res.data) {
              Cookies.set('token', res.data, {});
              let newConfig = Object.assign(tempConfig, {
                headers: { token: res.data },
              });
              return axios(newConfig);
            } else {
              console.log('error');
              bus.$emit('token_error_2');
            }
          });
      }
      return response.data; //对明确的200做脱壳处理
    }
    // http://www.axios-js.com/zh-cn/docs/#%E5%93%8D%E5%BA%94%E7%BB%93%E6%9E%84 官网的响应结构
    return response;
  },
  function(error) {
    console.log(error);
    // 对响应错误做点什么
    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          error.message = '请求错误(400)';
          break;
        case 401:
          this.$router.push('/login');
          break;
        case 403:
          error.message = '拒绝访问(403)';
          break;
        case 404:
          error.message = '请求出错(404)';
          break;
        case 408:
          error.message = '请求超时(408)';
          break;
        case 500:
          error.message = '服务器错误(500)';
          break;
        case 501:
          error.message = '服务未实现(501)';
          break;
        case 502:
          error.message = '网络错误(502)';
          break;
        case 503:
          error.message = '服务不可用(503)';
          break;
        case 504:
          error.message = '网络超时(504)';
          break;
        case 505:
          error.message = 'HTTP版本不受支持(505)';
          break;
        default:
          error.message = `连接出错(${error.response.status})!`;
      }
    } else {
      error.message = '连接服务器失败!';
    }
    return Promise.reject(error);
  }
);

let apiLogin = {
  testGet: function(data) {
    const url = '';
    return axiosLogin.get(url, {
      params: data,
    });
  },
  testPost: function(params, data) {
    const url = '';
    return axiosLogin.post(url, data, {
      params: params,
    });
  },
  //后面跟正式的api接口

  用户模块: {
    获取图形验证码: function(data) {
      // UserVerifyKey 客户端唯一识别码
      const url = '/api/User/GetAuthCode';
      return axiosLogin.get(url, {
        params: data,
        responseType: 'arraybuffer',
      });
    },
    用户发送短信验证码: function(params, data) {
      // {phoneNumber,userVerifyKey,userVerifyValue}
      const url = '/api/User/UserSendMsg';
      return axiosLogin.post(url, data, {
        data: params,
      });
    },
    用户注册: function(params, data) {
      // {phoneNumber,phoneVerifyValue}
      const url = '/api/User/UserRegister';
      return axiosLogin.post(url, data, {
        params: params,
      });
    },
    用户登录: function(params, data) {
      // {userName,userPwd,userVerifyKey,verifyCode}
      const url = '/api/User/UserLogin';
      return axiosLogin
        .post(url, data, {
          params: params,
        })
        .then((res) => {
          if (res.code == 200 && res.data) {
            storage.setLS('wtb-token', { value: res.data }); // 将res.data作为token缓存备用
          }
          return Promise.resolve(res);
        });
    },
    更新token: function(data) {
      // UserVerifyKey 客户端唯一识别码
      const url = '/api/User/UpdateToken';
      return axiosLogin.get(url, {
        params: data,
      });
    },
    找回密码前的账号校验: function(params, data) {
      const url = `/api/User/RetrievePwd`;
      return axiosLogin.post(url, data, {
        params: params,
      });
    },
    用户修改密码前的短信验证: function(params, data) {
      const url = `/api/User/UpdateUserPwdCheckMsg`;
      return axiosLogin.post(url, data, {
        params: params,
      });
    },
    更新密码: function(params, data) {
      const url = `/api/User/UpdateUserPwd`;
      return axiosLogin.post(url, data, {
        params: params,
      });
    },

    删除账号: function(params, data) {
      const url = `/api/User/DeleteUser`;
      return axiosLogin.post(url, data, {
        params: params,
      });
    },
  }, //用户模块
};

export { apiLogin };
